.TH TC 8 "December 2019" "iproute2" "Linux"
.SH NAME
ETS \- Enhanced Transmission Selection scheduler
.SH SYNOPSIS
.B tc qdisc ... ets [ bands
number
.B ] [ strict
number
.B ] [ quanta
bytes bytes bytes...
.B ] [ priomap
band band band...
.B ]

.B tc class ... ets [ quantum
bytes
.B ]

.SH DESCRIPTION

The Enhanced Transmission Selection scheduler is a classful queuing
discipline that merges functionality of PRIO and DRR qdiscs in one
scheduler. ETS makes it easy to configure a set of strict and
bandwidth-sharing bands to implement the transmission selection described
in 802.1Qaz.

On creation with 'tc qdisc add', a fixed number of bands is created. Each
band is a class, although it is not possible to directly add and remove
bands with 'tc class' commands. The number of bands to be created must
instead be specified on the command line as the qdisc is added.

The minor number of classid to use when referring to a band is the band
number increased by one. Thus band 0 will have classid of major:1, band 1
that of major:2, etc.

ETS bands are of two types: some number may be in strict mode, the
remaining ones are in bandwidth-sharing mode.

.SH ALGORITHM
When dequeuing, strict bands are tried first, if there are any. Band 0 is
tried first. If it did not deliver a packet, band 1 is tried next, and so
on until one of the bands delivers a packet, or the strict bands are
exhausted.

If no packet has been dequeued from any of the strict bands, if there are
any bandwidth-sharing bands, the dequeuing proceeds according to the DRR
algorithm. Each bandwidth-sharing band is assigned a deficit counter,
initialized to quantum assigned by a
.B quanta
element. ETS maintains an (internal) ''active'' list of bandwidth-sharing
bands whose qdiscs are non-empty. This list is used for dequeuing. A packet
is dequeued from the band at the head of the list if the packet size is
smaller or equal to the deficit counter. If the counter is too small, it is
increased by
.B quantum
and the scheduler moves on to the next band in the active list.

Only qdiscs that own their queue should be added below the
bandwidth-sharing bands. Attaching to them non-work-conserving qdiscs like
TBF does not make sense \-\- other qdiscs in the active list will be
skipped until the dequeue operation succeeds. This limitation does not
exist with the strict bands.

.SH CLASSIFICATION
The ETS qdisc allows three ways to decide which band to enqueue a packet
to:

- Packet priority can be directly set to a class handle, in which case that
  is the queue where the packet will be put. For example, band number 2 of
  a qdisc with handle of 11: will have classid 11:3. To mark a packet for
  queuing to this band, the packet priority should be set to 0x110003.

- A tc filter attached to the qdisc can put the packet to a band by using
  the \fBflowid\fR keyword.

- As a last resort, the ETS qdisc consults its priomap (see below), which
  maps packets to bands based on packet priority.

.SH PARAMETERS
.TP
strict
The number of bands that should be created in strict mode. If not given,
this value is 0.

.TP
quanta
Each bandwidth-sharing band needs to know its quantum, which is the amount
of bytes a band is allowed to dequeue before the scheduler moves to the
next bandwidth-sharing band. The
.B quanta
argument lists quanta for the individual bandwidth-sharing bands.
The minimum value of each quantum is 1. If
.B quanta
is not given, the default is no bandwidth-sharing bands, but note that when
specifying a large number of
.B bands,
the extra ones are in bandwidth-sharing mode by default.

.TP
bands
Number of bands given explicitly. This value has to be at least large
enough to cover the strict bands specified through the
.B strict
keyword and bandwidth-sharing bands specified in
.B quanta.
If a larger value is given, any extra bands are in bandwidth-sharing mode,
and their quanta are deduced from the interface MTU. If no value is given,
as many bands are created as necessary to cover all bands implied by the
.B strict
and
.B quanta
keywords.

.TP
priomap
The priomap maps the priority of a packet to a band. The argument is a list
of numbers. The first number indicates which band the packets with priority
0 should be put to, the second is for priority 1, and so on.

There can be up to 16 numbers in the list. If there are fewer, the default
band that traffic with one of the unmentioned priorities goes to is the
last one.

.SH EXAMPLE & USAGE

.P
Add a qdisc with 8 bandwidth-sharing bands, using the interface MTU as
their quanta. Since all quanta are the same, this will lead to equal
distribution of bandwidth between the bands, each will get about 12.5% of
the link. The low 8 priorities go to individual bands in a reverse 1:1
fashion (such that the highest priority goes to the first band).

.P
# tc qdisc add dev eth0 root handle 1: ets bands 8 priomap 7 6 5 4 3 2 1 0
.br
# tc qdisc show dev eth0
.br
qdisc ets 1: root refcnt 2 bands 8 quanta 1514 1514 1514 1514 1514 1514 1514 1514 priomap 7 6 5 4 3 2 1 0 7 7 7 7 7 7 7 7

.P
Tweak the first band of the above qdisc to give it a quantum of 2650, which
will give it about 20% of the link (and about 11.5% to the remaining
bands):

.P
# tc class change dev eth0 classid 1:1 ets quantum 2650
.br
# tc qdisc show dev eth0
.br
qdisc ets 1: root refcnt 2 bands 8 quanta 2650 1514 1514 1514 1514 1514 1514 1514 priomap 7 6 5 4 3 2 1 0 7 7 7 7 7 7 7 7

.P
Create a purely strict Qdisc with reverse 1:1 mapping between priorities
and bands:

.P
# tc qdisc add dev eth0 root handle 1: ets strict 8 priomap 7 6 5 4 3 2 1 0
.br
# tc qdisc sh dev eth0
.br
qdisc ets 1: root refcnt 2 bands 8 strict 8 priomap 7 6 5 4 3 2 1 0 7 7 7 7 7 7 7 7

.P
Add a Qdisc with 6 bands, 3 strict and 3 ETS with 35%-30%-25% weights:
.P
# tc qdisc add dev eth0 root handle 1: ets strict 3 quanta 3500 3000 2500 priomap 0 1 1 1 2 3 4 5
.br
# tc qdisc sh dev eth0
.br
qdisc ets 1: root refcnt 2 bands 6 strict 3 quanta 3500 3000 2500 priomap 0 1 1 1 2 3 4 5 5 5 5 5 5 5 5 5

.P
Create a Qdisc such that traffic with priorities 2, 3 and 4 are strictly
prioritized over other traffic, and the rest goes into bandwidth-sharing
classes with equal weights:
.P
# tc qdisc add dev eth0 root handle 1: ets bands 8 strict 3 priomap 3 4 0 1 2 5 6 7
.br
# tc qdisc sh dev eth0
.br
qdisc ets 1: root refcnt 2 bands 8 strict 3 quanta 1514 1514 1514 1514 1514 priomap 3 4 0 1 2 5 6 7 7 7 7 7 7 7 7 7

.SH SEE ALSO
.BR tc (8),
.BR tc-prio (8),
.BR tc-drr (8)

.SH AUTHOR
Parts of both this manual page and the code itself are taken from PRIO and
DRR qdiscs.
.br
ETS qdisc itself was written by Petr Machata.
